package models

import (
	"gorm.io/gorm"
	"smart-health-platforms/config"
	"time"
)

type Brands struct {
	Id               uint           `gorm:"column:id;type:bigint;comment:品牌id;primaryKey;not null;" json:"id"`                                        // 品牌id
	BrandName        string         `gorm:"column:brand_name;type:varchar(20);comment:品牌名称;not null;" json:"brand_name"`                              // 品牌名称
	BrandDescription string         `gorm:"column:brand_description;type:varchar(255);comment:品牌介绍;" json:"brand_description"`                        // 品牌介绍
	CreatedAt        time.Time      `gorm:"column:created_at;type:datetime(3);comment:创建时间;not null;default:CURRENT_TIMESTAMP(3);" json:"created_at"` // 创建时间
	UpdatedAt        time.Time      `gorm:"column:updated_at;type:datetime(3);comment:修改时间;not null;default:CURRENT_TIMESTAMP(3);" json:"updated_at"` // 修改时间
	DeletedAt        gorm.DeletedAt `gorm:"column:deleted_at;type:datetime(3);comment:删除时间;default:NULL;" json:"deleted_at"`                          // 删除时间
}

// CreateBrands 品牌信息创建
func (b *Brands) CreateBrands() error {
	return config.DB.Create(&b).Error
}

// BrandsDetail 品牌信息详情
func (b *Brands) BrandsDetail() error {
	return config.DB.Where("id = ?", b.Id).Find(&b).Error
}

// BrandsUpdate 品牌信息修改
func (b *Brands) BrandsUpdate() error {
	return config.DB.Model(&b).Where("id = ?", b.Id).Updates(&b).Error
}

// BrandsDelete 品牌信息删除
func (b *Brands) BrandsDelete() error {
	return config.DB.Where("id = ?", b.Id).Delete(&b).Error
}

// 通过ID查找品牌
func (b *Brands) GetBrandsById(id int64) error {
	return config.DB.Where("id = ?", id).Limit(1).Find(&b).Error
}

// 品牌列表查询
func (b *Brands) GetBrandsList(page, pageSize int) (brandsList []*Brands, err error) {
	err = config.DB.Model(&b).Where("brand_name like ?", "%"+b.BrandName+"%").
		Scopes(Paginate(page, pageSize)).Find(&brandsList).Error
	return
}

// 分页
func Paginate(page, pageSize int) func(db *gorm.DB) *gorm.DB {
	return func(db *gorm.DB) *gorm.DB {

		if page <= 0 {
			page = 1
		}

		switch {
		case pageSize > 100:
			pageSize = 100
		case pageSize <= 0:
			pageSize = 10
		}

		offset := (page - 1) * pageSize
		return db.Offset(offset).Limit(pageSize)
	}
}
